/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nextel.project.devolucion;
import com.nextel.project.Configuracion;
import com.nextel.project.agps.ControlAgps;
import com.nextel.project.devolucion.bean.DevolucionBean;
import com.nextel.project.devolucion.bean.DevolucionDetalleBean;
import com.nextel.project.devolucion.mvc.MVCDevolucionDatos;
import com.nextel.project.devolucion.mvc.MVCDevolucionFin;
import com.nextel.project.devolucion.mvc.MVCMotivoDevolucion;
import com.nextel.project.cliente.ControlCliente;
import com.nextel.project.cliente.mvc.MVCClienteDetalle;
import com.nextel.project.dao.HttpControl;
import com.nextel.project.dao.XMLDAO;
import com.nextel.project.devolucion.mvc.MVCResumenDevolucion;
import com.nextel.project.pedido.bean.ArticuloBean;
import com.nextel.project.pedido.bean.ArticuloPorCodigoBean;
import com.nextel.project.pedido.bean.ArticuloPorNombreBean;
import com.nextel.project.pedido.mvc.MVCProductoPedido;
import com.nextel.project.pedido.mvc.MVCProductoResultado;
import com.nextel.project.pedido.rms.RMSArticulo;
import com.nextel.project.pedido.rms.RMSArticuloPorCodigo;
import com.nextel.project.pedido.rms.RMSArticuloPorNombre;
import com.nextel.project.devolucion.rms.RMSDevolucion;
import com.nextel.project.pedido.mvc.MVCProductoBusqueda;
import com.nextel.project.pedido.rms.RMSKPI;
import com.nextel.project.reporte.bean.ReporteKPIBean;
import com.nextel.project.reporte.mvc.BarsCanvas;
import com.nextel.project.reporte.mvc.MVCReporteKPI;
import com.nextel.project.usuario.ControlUsuario;
import pe.com.nextel.main.ControlBase;
import java.io.InputStream;
import javax.microedition.io.HttpConnection;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.Fecha;
import pe.com.nextel.util.Iterator;
import pe.com.nextel.util.List;
import pe.com.nextel.util.StringUtils;

/**
 *
 *
 */
public class ControlDevolucion extends ControlBase {
    
    private static final ControlDevolucion control = new ControlDevolucion();
    //current
    public DevolucionBean currentDevolucion;
    public DevolucionDetalleBean currentDevolucionDetalle;
    public ReporteKPIBean currentKPI;
    // rms
    public final RMSArticulo rmsArticulo = new RMSArticulo();
    public final RMSArticuloPorCodigo rmsArticuloPorCodigo = new RMSArticuloPorCodigo();
    public final RMSArticuloPorNombre rmsArticuloPorNombre = new RMSArticuloPorNombre();
    public final RMSKPI rmsKPI = new RMSKPI();
    public final RMSDevolucion rmsDevolucion = new RMSDevolucion();
    
    
    
    public final MVCProductoBusqueda mvcProductoBusqueda = new MVCProductoBusqueda();
    //public final MVCProductoBusqueda mvcProductoBusqueda1 = new MVCProductoBusqueda();
    
    
    public final MVCClienteDetalle mvcClienteDetalle = new MVCClienteDetalle();
    public final MVCDevolucionDatos mvcDevolucionDatos = new MVCDevolucionDatos();
    public final MVCMotivoDevolucion mvcDevolucionLista = new MVCMotivoDevolucion();
    
    public final MVCProductoPedido mvcProductoPedido = new MVCProductoPedido();
    public final MVCProductoResultado mvcProductoResultado = new MVCProductoResultado();
    
    public final MVCDevolucionFin mvcDevolucionFin = new MVCDevolucionFin();
    public final MVCResumenDevolucion mvcResumenDevolucion = new MVCResumenDevolucion();
    
    public final MVCReporteKPI mvcReporteKPI = new MVCReporteKPI();
//    public final BarsCanvas mvcGrafico = new BarsCanvas();
    public static final byte DEVOLUCION = 2;
    
    public Thread threadBusqueda;
    
    private byte busquedaMVC = 2;
    private List listapendientes;
    
    /**
     * metodo de acceso para instanciar los recordStored
     */
    public static ControlDevolucion getInstance() {
        return control;
    }
    
    public void joinThreadBusqueda() {
        try {
            if (threadBusqueda != null && threadBusqueda.isAlive()) {
                threadBusqueda.join();
            }
        } catch (Exception e) {
        }
    }
    
    /**
     * para no crear mas instancias
     */
    private ControlDevolucion() {
        
    }
    
    public void procesarKpi(){
        try{
            currentKPI = rmsKPI.obtenerKPI();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    /*****************************************************************************/
    /********************LOGICA DE NEGOCIO **************************************/
    /*****************************************************************************/
    public void iniciarDevolucion() {
        try {
            // limpiamos las transacciones
            limpiarMemoriaTransacciones();
            currentDevolucion = new DevolucionBean(ControlUsuario.getInstance().currentUsuario, ControlCliente.getInstance().currentCliente);
            mvcProductoBusqueda.setBusquedaMVC(getBusquedaMVC());
            if("1".equals(ControlUsuario.getInstance().currentUsuario.gps)){
                if (ControlAgps.getInstance().currentGPS != null) {
                    currentDevolucion.latitud=ControlAgps.getInstance().currentGPS.getLatitude();
                    currentDevolucion.longitud=ControlAgps.getInstance().currentGPS.getLongitude();
                }
            }
            // String lsFecha=pe.com.nextel.util.Fecha.getFechaActualCompleta();
            
            currentDevolucion.setFechMobil(Fecha.getDate().getTime());
            setCurrent(mvcResumenDevolucion);
            //setCurrent(mvcProductoBusqueda);
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, ControlCliente.getInstance().mvcClienteBusqueda.showScreen());
        }
    }
    
    public void grabarDevolucion() {
        try {
            if("1".equals(ControlUsuario.getInstance().currentUsuario.gps)){
                if (ControlAgps.getInstance().currentGPS != null) {
                    currentDevolucion.latitud=ControlAgps.getInstance().currentGPS.getLatitude();
                    currentDevolucion.longitud=ControlAgps.getInstance().currentGPS.getLongitude();
                }
            }
            this.incrementarKpi();
            
            if( !ControlCliente.getInstance().currentCliente.isEnLinea() ) {
                ControlCliente.getInstance().currentCliente.setEstado(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_VISITADO));
                ControlCliente.getInstance().rmsCliente.actualizarObjectLista(ControlCliente.getInstance().currentCliente);
            }
            rmsDevolucion.grabarDevolucion(currentDevolucion);
            
            this.enviarDevolucion();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void incrementarKpi() throws Exception {
        // contabilizamos los kpi
        this.procesarKpi();
        
        if( ControlCliente.getInstance().currentCliente.getEstado().equals( IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_POR_VISITAR) ) ||  ControlCliente.getInstance().currentCliente.getEstado().equals(null) ) {
            currentKPI.clienteVisitados = currentKPI.clienteVisitados + 1 ;
        }
        rmsKPI.guardarKPI(currentKPI);
    }
    
    public void enviarDevolucion() throws Exception {
        //#debug
        //System.out.println("controldevolucion.enviarDevolucion");        
        if(!StringUtils.withSignal()) {
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOCOBERTURA_ENVIO), ControlCliente.getInstance().mvcClienteDetalle.showScreen() );//"Zona sin cobertura, procesar el env\u00EDo mediante la opcion ENVIOS del menu principal"
            return;
        }        
        this.enviarDevolucionFun();
    }

    public void enviarDevolucionTotal() throws Exception {
        //#debug
        //System.out.println("controldevolucion.enviarDevolucion");
        if(!StringUtils.withSignal()) {
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOCOBERTURA_ENVIO), ControlUsuario.getInstance().mvcEnvio.showScreen() );//"Zona sin cobertura, procesar el env\u00EDo mediante la opcion ENVIOS del menu principal""Zona sin cobertura, procesar el env\u00EDo mediante la opcion ENVIOS del menu principal"
            return;
        }
        this.enviarDevolucionFun();
    }

    public void enviarDevolucionFun()throws Exception
    {
        //rmsDevolucion.getAllBytes(getMensajeHttp());
        listapendientes = rmsDevolucion.getAllBean();

        getMensajeHttp().setTipoEnvio(HttpConnection.POST);
        getMensajeHttp().setUrl(Configuracion.URL_ENVIO_DEVOLUCION);

        getMensajeHttp().setMensaje(XMLDAO.getInstance().writeXMLDevolucion(listapendientes).getBytes());

        System.out.println("url =" + Configuracion.URL_ENVIO_DEVOLUCION);
        System.out.println("data =" + XMLDAO.getInstance().writeXMLDevolucion(listapendientes));

        HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_DEVOLUCION);
        iniciarConexionHTTP();

    }

    
    public void actualizarDevolucion(InputStream in) {
        //#debug
        //System.out.println("actualizarDevolucion");
        
        try {
            //XMLDAO.getInstance().parseMensaje(in);
            XMLDAO.getInstance().parseMensajeXML(in);
            limpiarMemoriaTransacciones();
            rmsDevolucion.deleteAll();
            
            if(ControlCliente.getInstance().currentCliente != null){
                //System.out.println("------->1");
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_DEVOLUCION_REGISTRADA), ControlCliente.getInstance().mvcClienteDetalle.showScreen());//"Devoluci\u00F3n registrada"
            }else if (busquedaMVC == DEVOLUCION){
                //System.out.println("------->2");
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_DEVOLUCION_REGISTRADA), ControlUsuario.getInstance().mvcEnvio.showScreen());//"Devoluci\u00F3n registrada"
            }
            
            
        } catch (Exception e) {
            e.printStackTrace();
            
            if(ControlCliente.getInstance().currentCliente != null){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOATENDIO_DEVOLUCION)+": " + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());//No se pudo atender la devoluci\u00F3n
            }else if (busquedaMVC == DEVOLUCION){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOATENDIO_DEVOLUCION)+": " + e, ControlUsuario.getInstance().mvcEnvio.showScreen());//No se pudo atender la devoluci\u00F3n
            }
        }
    }
    
    public List getListDevolucionPorCliente() {
        try {
            return rmsDevolucion.getListaDevolucionPorCliente(ControlCliente.getInstance().currentCliente);
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());
        }
        return null;
    }
    
    public List getListDevolucionPendientes() {
        try {
            return rmsDevolucion.getDevolucionesPendientesEnvio();
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());
        }
        return null;
    }
    
    public int getNumeroDevolucionesPendientes() {
        
        int total = 0;
        try {
            List lst = getListDevolucionPendientes();
            if ((lst != null) && (lst.size() >= 0)) {
                total = lst.size();
            }
                    
        } catch (Exception e) {
            e.printStackTrace();
            total = 0;
        }
        
        return total;
        
    }
    
    public void modificarDevolucion() {
        //#debug
        //System.out.println("modificar Canje");
        try {
            currentDevolucionDetalle = (null);
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e, ControlCliente.getInstance().mvcClienteBusqueda.showScreen());
        }
    }
    
    /*********************************************************************************/
    /**********************  ARTICULO  ***********************************************/
    /*********************************************************************************/
    public DevolucionDetalleBean getArticulo(ArticuloPorNombreBean articuloPorNombre) {
        //#debug
        //System.out.println("Midlet.getArticulo");
        
        try {
            ArticuloBean articulo = (ArticuloBean) rmsArticulo.getObject(articuloPorNombre.getIdRecordArticulo(), articuloPorNombre.getPosRecordArticulo());
            if( existeArticulo(articulo.getCodigo()) ) {
                ControlDevolucion.getInstance().showMensaje( IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ARTICULO_EXISTE_DEVOLUCION), ControlDevolucion.getInstance().mvcResumenDevolucion.showScreen() );//"El articulo ya existe en la devoluci\u00F3n"
                return null;
            }
            
            DevolucionDetalleBean ddev = new DevolucionDetalleBean();
            ddev.setCodigoArticulo(articulo.getCodigo());
            ddev.setNombreArticulo(articulo.getNombre());
            currentDevolucionDetalle = (ddev);
            return ddev;
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e, mvcProductoBusqueda.showScreen());
        }
        return null;
    }
    
    public boolean existeArticulo(String codigo) {
        Iterator it = ControlDevolucion.getInstance().currentDevolucion.getLstDevolucionDetalle().iterator();
        while( it.hasNext() ) {
            String codArtDev = ((DevolucionDetalleBean)it.next()).getCodigoArticulo();
            if( codigo.equals( codArtDev ) )
                return true;
        }
        return false;
    }
    
    public DevolucionDetalleBean buscarPorCodigoProducto(String codigo) {
        //#debug
        //System.out.println("Midlet.buscarPorCodigoProducto");
        
        try {
            ArticuloPorCodigoBean articuloPorcodigo = rmsArticuloPorCodigo.buscarArticulo(codigo);
            
            if (articuloPorcodigo != null) {
                //ArticuloPorCodigoBean articuloPorcodigo = (ArticuloPorCodigoBean) obj;
                
                if( existeArticulo(articuloPorcodigo.getCodigoArticulo()) ) {
                    ControlDevolucion.getInstance().showMensaje( IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ARTICULO_EXISTE_DEVOLUCION), ControlDevolucion.getInstance().mvcResumenDevolucion.showScreen() );//"El articulo ya existe en la devoluci\u00F3n"
                    return null;
                }
                
                ArticuloBean articulo = (ArticuloBean) rmsArticulo.getObject(articuloPorcodigo.getIdRecordArticulo(), articuloPorcodigo.getPosRecordArticulo());
                DevolucionDetalleBean ddev = new DevolucionDetalleBean();
                ddev.setCodigoArticulo(articulo.getCodigo());
                ddev.setNombreArticulo(articulo.getNombre());
                currentDevolucionDetalle = (ddev);
                return ddev;
            } else {
                ControlDevolucion.getInstance().showError( IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ARTICULO)+" " + codigo + " "+IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOEXISTE), ControlDevolucion.getInstance().mvcResumenDevolucion.showScreen());//El Art\u00EDculo  ; NO existe
                return null;
            }
        } catch (Exception e) {
            showError("Error : " + e, mvcProductoBusqueda.showScreen());
        }
        return null;
    }
    
    public void buscarPorNombreProducto(final String nombre) {
        //#debug
        //System.out.println("Midlet.buscarPorNombreProducto");
        try {
            joinThreadBusqueda();
            mvcProductoResultado.setBusquedaMVC(getBusquedaMVC());
            setCurrent(mvcProductoResultado);
            threadBusqueda = null;
            threadBusqueda = new Thread() {
                public void run() {
                    try {
                        rmsArticuloPorNombre.buscarPorNombreArticulos(nombre, mvcProductoResultado);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            threadBusqueda.start();
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, mvcProductoBusqueda.showScreen());
        }
    }
    
    public void limpiarMemoriaTransacciones() {
        
        if (currentDevolucionDetalle != null) {
            currentDevolucionDetalle.clear();
            currentDevolucionDetalle = null;
        }
        
        if (currentDevolucion != null) {
            currentDevolucion.clear();
            currentDevolucion = null;
        }
        System.gc();
    }
    
    public void limpiarMemoria() {
        currentKPI = null;
        limpiarMemoriaTransacciones();
        System.gc();
    }
    
    public void eliminarDatos() throws Exception {
        rmsArticulo.deleteAll();
        rmsArticuloPorCodigo.deleteAll();
        rmsArticuloPorNombre.deleteAll();
        rmsKPI.deleteAll();
        rmsDevolucion.deleteAll();
    }
    
//    public BarsCanvas getBarras() {
//        mvcGrafico.setTitle("Devolucion");
//        mvcGrafico.setTotalCustomers(currentKPI.totalClientes, "Total");
//        mvcGrafico.setTotalCustomersAttended(currentKPI.clienteVisitados, "Atendido");
//        return mvcGrafico;
//    }
    
    public byte getBusquedaMVC() {
        return busquedaMVC;
    }
    
    public void setBusquedaMVC(byte busquedaMVC) {
        this.busquedaMVC = busquedaMVC;
    }
}
